#include <iostream>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <signal.h>
       #include <fcntl.h>


/*
 * 参数nochdir为0，则将守护进程的工作目录该为根目录，否则不做处理
 * 参数noclose为0，则将守护进程的标准输入、标准输出以及标准错误重定向到/dev/null，否则不做处理
 */

void my_deamom(int nochdir = 0, int noclose = 0)
{
    // 原生创建守护进程步骤如下
    // 1.设置文件掩码为0。
    umask(0);

    // 2.fork后终止父进程，子进程创建新会话。
    if (fork() > 0)
    {
        exit(0);
    }

    // 3.忽略SIGCHLD信号。
    signal(SIGCHLD, SIG_IGN);

    // 4.再次fork，终止父进程，保持子进程不是会话首进程，从而保证后续不会再和其他终端相关联。
    if (fork() > 0)
    {
        exit(0);
    }

    // 5.更改工作目录为根目录。
    if(nochdir == 0)
    {
        chdir("/");
    }

    // 6.将标准输入、标准输出、标准错误重定向到/dev/null。
    if(noclose == 0)
    {
        close(0);
        int fd = open("/dev/null",O_RDWR);
        dup2(fd,1);
        dup2(fd,2);
    }
}

int main()
{
    my_deamom();
    while(1);
    return 0;
}